package com.unionpay.upyzt.example;

import com.unionpay.upyzt.Upyzt;
import com.unionpay.upyzt.exception.UpyztException;
import com.unionpay.upyzt.model.SettleAcct;
import com.unionpay.upyzt.resp.SettleAcctDeleteResp;
import com.unionpay.upyzt.resp.SettleAcctListResp;
import com.unionpay.upyzt.resp.SettleAcctResp;
import com.unionpay.upyzt.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

public class SettleAcctExample {

    /**
     * 个人用户号（与 mchId 二选一）
     */
    private final String cusId;

    /**
     * 二级商户号（与 cusId 二选一）
     */
    private final String mchId;

    public SettleAcctExample(String cusId, String mchId) {
        this.cusId = cusId;
        this.mchId = mchId;
    }

    /**
     * 运行 Demos
     *
     * @param cusId 个人用户号（与 mchId 二选一）
     * @param mchId 二级商户号（与 cusId 二选一）
     */
    public static void runDemos(String cusId, String mchId) throws UpyztException {
        SettleAcctExample settleAcctExample = new SettleAcctExample(cusId, mchId);

        // 新增绑定账户
        SettleAcctResp settleAcctResp = settleAcctExample.create();

        // 绑定账户查询（绑定账户编号）
        settleAcctResp = settleAcctExample.retrieveById(settleAcctResp.getSettleAcctId());

        // 绑定账户查询（平台订单号）
        settleAcctResp = settleAcctExample.retrieveByOutRequestNo(settleAcctResp.getOutRequestNo());

        // 绑定账户查询（用户ID）
        SettleAcctListResp settleAcctListResp = settleAcctExample.retrieveByUserId();

        // 打款金额验证（绑定账户编号）
        settleAcctResp = settleAcctExample.validateBySettleAcctId(settleAcctResp.getSettleAcctId());

        // 打款金额验证（用户银行账号）
        settleAcctResp = settleAcctExample.validateByBankAcctNo(mchId, settleAcctResp);

        // 删除绑定账户
        SettleAcctDeleteResp settleAcctDeleteResp = settleAcctExample.removeById(settleAcctResp.getSettleAcctId());
    }

    /**
     * 新增绑定账户
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctResp create() throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        params.put("out_request_no", Main.generateRandomOutNo());
        if (!StringUtils.isBlank(cusId)) {
            params.put("cus_id", cusId);
        }
        if (!StringUtils.isBlank(mchId)) {
            params.put("mch_id", mchId);
        }
        params.put("bank_acct_type", "1");
        params.put("bank_code", "102100099996");
        params.put("bank_address_code", "110105");
        params.put("bank_branch_code", "001618845004");
        params.put("bank_acct_no", Upyzt.encryptField("123456790"));
        params.put("mobile_number", Upyzt.encryptField("12345678901"));
        // 是否必传取决于平台业务参数配置
        params.put("sms_code", "999999");
        // 拓展字段配合业务参数, 无业务要求无需传
        // params.put("extra", new HashMap<String, String>());
        System.out.println("------- 新增绑定账户 -------");
        SettleAcctResp resp = SettleAcct.create(params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 二级商户进件状态查询（绑定账户编号）
     *
     * @param id 绑定账户编号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctResp retrieveById(String id) throws UpyztException {
        System.out.println("------- 绑定账户查询（绑定账户编号） -------");
        SettleAcctResp resp = SettleAcct.retrieveById(id);
        System.out.println(resp);
        return resp;
    }

    /**
     * 绑定账户查询（平台订单号）
     *
     * @param outRequestNo 平台订单号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctResp retrieveByOutRequestNo(String outRequestNo) throws UpyztException {
        System.out.println("------- 绑定账户查询（平台订单号） -------");
        SettleAcctResp resp = SettleAcct.retrieveByOutRequestNo(outRequestNo);
        System.out.println(resp);
        return resp;
    }


    /**
     * 绑定账户查询（用户ID）
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctListResp retrieveByUserId() throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        if (!StringUtils.isBlank(cusId)) {
            params.put("cus_id", cusId);
        }
        if (!StringUtils.isBlank(mchId)) {
            params.put("mch_id", mchId);
        }
        // 用于筛选指定状态的绑定账户列表，不传表示无筛选。
        // 枚举值：processing: 验证中|succeeded: 验证成功|failed: 验证失败|blocked: 验证锁定中，需联系银行业务人员触发重新打款|needless: 无需验证
        params.put("verify_status", "processing");
        System.out.println("------- 绑定账户查询（用户ID） -------");
        SettleAcctListResp resp = SettleAcct.retrieveByUserId(params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 验证绑定账户(打款金额验证) （用validateBySettleAcctId替代）
     *
     * @return 返回参数
     * @throws UpyztException 异常
     * @deprecated 1.3.2后续迭代将删除，可使用validateBySettleAcctId替代
     */
    @Deprecated
    public SettleAcctResp validate(String id) throws UpyztException {
        return validateBySettleAcctId(id);
    }

    /**
     * 打款金额验证（绑定账户编号）
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctResp validateBySettleAcctId(String id) throws UpyztException {
        System.out.println("------- 打款金额验证（绑定账户编号） -------");
        Map<String, Object> params = new HashMap<>();
        params.put("pay_amount", 12);
        SettleAcctResp resp = SettleAcct.validateBySettleAcctId(id, params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 打款金额验证（用户银行账号）
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctResp validateByBankAcctNo(String mchId, SettleAcctResp settleAcctResp) throws UpyztException {
        System.out.println("------- 打款金额验证（用户银行账号） -------");
        Map<String, Object> params = new HashMap<>();
        params.put("mch_id", mchId);
        params.put("bank_acct_no", Upyzt.encryptField(settleAcctResp.getBankAcctNo()));
        params.put("pay_amount", 12);
        SettleAcctResp resp = SettleAcct.validateByBankAcctNo(params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 删除绑定账户
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public SettleAcctDeleteResp removeById(String id) throws UpyztException {
        System.out.println("------- 删除绑定账户 -------");
        SettleAcctDeleteResp resp = SettleAcct.removeById(id);
        System.out.println(resp);
        return resp;
    }


}
